//============================================================================================
/**
 * @file	pkthln_run_sub.c
 * @brief	マラソンサブ画面
 * @author	Nozomu Saito
 *
 * モジュール名：RunSub_
 */
//============================================================================================

#include "pkthln_run_sub.h"
#include "strbuf_family.h"
#include "system/softsprite.h"
#include "system/arc_tool.h"
#include "system/gra_tool.h"
#include "system/clact_util_vram.h"
#include "system/fontproc.h"
#include "system/msgdata_util.h"
#include "system/wordset.h"
#include "poketool/poke_tool.h"
#include "poketool/pokeicon.h"

#include "../../../../field/field_cutin.naix"

#include "run_obj_pri.h"
#include "../pkthln_act_def.h"
#include "../../poke_clact.h"

#include "msgdata/msg.naix"
#include "msgdata/msg_pokethlon.h"

#include "pkthev_run.naix"
#include "run_comm.h"

#define TRANS_POKE_NUM	(2)
#define TRNS_PALETTE_NUM	(1)
#define BG_PRI	(3)

#define POKE_MAX		(ENTRY_MAX*ENTRY_MEMBER_NUM_MAX)
#define SUB_RUN_PALETTE_NUM	(3+2)	//アイコンパレット3+サブパレット2

// ポケモンアイコンが始まるVRAM上でのオフセット
#define POKEICON_VRAM_OFFSET	(48*0x20)		//共通リソース依存　共通リソースの後ろから
//ポケモンアイコンサイズ
#define POKEICON_TRANS_CHARA	(4*4)
//アイコン転送サイズ
#define POKEICON_TRANS_SIZE		(POKEICON_TRANS_CHARA*0x20)
// ポケモンアイコンのパレットを転送するオフセット
#define POKEICON_PAL_OFFSET		( 1 )		//共通リソースパレット1本分オフセットをつける

#define LEN_MAX	(1024)

#define CIRCLE_R	(10*8)	//サークルの半径（ドット）
#define CIRCLE_CENTER_X	(20*8)	//サークルの中心Ｘ（ドット）
#define CIRCLE_CENTER_Y	(12*8)	//サークルの中心Ｙ（ドット）

#define ROUND_NUMBER_W	(4)		//周回用数字横キャラ幅
#define ROUND_NUMBER_H	(8)		//周回用数字縦キャラ幅
#define ROUND_DIGI_MAX	(2)		//週回数は最大2桁
#define ROUND_DISP_START_X	(14)	//周回数描画開始X位置（キャラ）
#define ROUND_DISP_START_Y	(8)		//週回数描画開始Y位置（キャラ）
#define RFLOAT_DISP_START_X	(24)	//周回数描画開始X位置（キャラ）
#define NUMBER_SCR_NUM_W	(5)	//数字スクリーンデータの横の数字の数0〜4	スクリーンデータに依存
#define NUMBER_SCR_NUM_H	(2)	//数字スクリーンデータの縦の数字の数5〜9	スクリーンデータに依存

#define POKEGRA_W	(80)			//ポケグラの幅80ドット

#define POKEGRA_MARGINE	(8)			//ポケグラの間隔8ドット
#define SLIDE_SPEED	(32*FX32_ONE)		//ポケグラスライドスピード

#define POKEGRA_POS1		(6*8)
#define POKEGRA_POS2		(17*8)
#define POKEGRA_OUT_POS		(28*8)
#define MOVE_DIST	(11*8)

//ＢＭＰ関連
#define	RUN_SYS_FONT_PAL	(15)
#define FONT_PAL	(RUN_SYS_FONT_PAL)
#define WIN_CGX_BASE	(1)
#define WIN_POKENAME_CGX	(WIN_CGX_BASE)
#define MSG_BG	(GF_BGL_FRAME0_S)

#define WIN_POKENAME_PX		(0)
#define WIN_POKENAME_PY		(22)
#define WIN_POKENAME_SX		(16)
#define WIN_POKENAME_SY		(2)

#define WIN_ROUND_PX		(24)
#define WIN_ROUND_PY		(16)
#define WIN_ROUND_SX		(6)
#define WIN_ROUND_SY		(2)
#define WIN_ROUND_CGX		(WIN_POKENAME_CGX+(WIN_POKENAME_SX*WIN_POKENAME_SY))


#define	COL_N_WHITE	( GF_PRINTCOLOR_MAKE( 15, 14, 0 ) )		// フォントカラー：白

#define WATCH_POS_X	(16*8)
#define WATCH_POS_Y	(7*8)

#define TIMER_ACT_POS_X	(18*8)
#define TIMER_ACT_POS_Y	(7*8)

#define TIMER_ACT_NUM	(6)

typedef struct R_NPC_DATA_tag
{
	u16 Move;
	u16 Count;
}NPC_DATA;

typedef struct RUN_SUB_POKE_ICON_tag
{
	int X;
	int Y;
	int PokeIdx;
	//アイコン
	PKTHLN_ACT_PTR	IconActPtr;
	//ステート
	PKTHLN_ACT_PTR	StateActPtr;
	//交換
	PKTHLN_ACT_PTR	ChgActPtr;
	//マーカー
	PKTHLN_ACT_PTR	MarkerActPtr;

	u8 StateLocal;
	u8 dummy[3];
}RUN_SUB_POKE_ICON;

typedef struct POKE_GRA_tag
{
	void *PokeChar;
	void *PokePal;
}POKE_GRA;

typedef struct RUN_SUB_CNT_tag
{
	int HeapID;
	PKTHLN_PTR PkthlnPtr;		//ポケスロンポインタ	これで、マイステータスとかにアクセスする

	GF_BGL_INI * Bgl;
	GF_BGL_BMPWIN	NameWin;			// BMPウィンドウデータ
	GF_BGL_BMPWIN	RoundWin;		// BMPウィンドウデータ
	MSGDATA_MANAGER* MsgMan;
	WORDSET * Wset;

	void *RoundBgArc;
	NNSG2dScreenData *RoundScrnData;
	RUN_SUB_POKE_ICON PokeIcon[ENTRY_MEMBER_NUM_MAX];

	u8 *IconBuf[POKE_MAX];
	NNSG2dCharacterData *IconChara[POKE_MAX];
	u8 IconPalNo[POKE_MAX];

	POKE_GRA	PokeGra[ENTRY_MAX];
	u32 ImageVram[TRANS_POKE_NUM];
	u32 PaletteVram[TRANS_POKE_NUM];
	PKTHLN_ACT_PTR	ActPtr[TRANS_POKE_NUM];	//ポケグラ
	PKTHLN_ACT_PTR	SweatActPtr[TRANS_POKE_NUM];	//ポケグラの汗
	u16 PokeIdx[TRANS_POKE_NUM];

	int PokeGraChgSeq;		//交代シーケンサ
	int SlideTarget;		//スライド対象 0 or 1

	u8 LocalPokeIdx[ENTRY_MEMBER_NUM_MAX];

	//ポケモンニックネーム
	STRBUF *NickName[ENTRY_MAX];
	CLACT_WORK_PTR	TimeNumActPtr[TIMER_ACT_NUM];	//分1桁、秒2桁、小数1桁、カンマ2つ

	//NPCダミースライドデータ
	NPC_DATA NpcData[ENTRY_MEMBER_NUM_MAX-1];
}RUN_SUB_CNT;

//ＢＮＰウィンドウデータ
static const BMPWIN_DAT RunEvtBmpData[2] = {
	{
		MSG_BG, WIN_POKENAME_PX, WIN_POKENAME_PY,
		WIN_POKENAME_SX, WIN_POKENAME_SY, FONT_PAL, WIN_POKENAME_CGX,
	},
	{
		MSG_BG, WIN_ROUND_PX, WIN_ROUND_PY,
		WIN_ROUND_SX, WIN_ROUND_SY, FONT_PAL, WIN_ROUND_CGX,
	},
};

//タイマーアクターアニメ番号（セルアニメデータ依存）
static const u8 DefaultTimerActAnm[TIMER_ACT_NUM] = {
	1,12,1,1,11,1,				//○，○○，○を表示
};
//タイマーアクターX座標
static const u8 TimerActPosX[TIMER_ACT_NUM] = {
	TIMER_ACT_POS_X, TIMER_ACT_POS_X+8, TIMER_ACT_POS_X+24, TIMER_ACT_POS_X+40,
	TIMER_ACT_POS_X+48, TIMER_ACT_POS_X+64,
};

static void UpdateNextPoke(RUN_SUB_CNT_PTR ptr, const u8 inPokeIdx);
static void DispRoundTxt(RUN_SUB_CNT_PTR ptr);
static void SetPokeGra(PKTHLN_CLACT_CNT_PTR inActCntPtr, RUN_SUB_CNT_PTR ptr);
static void AttouchPokeVramAdr( PKTHLN_CLACT_CNT_PTR inActPtr, RUN_SUB_CNT_PTR ptr );
static void CreateBmpWin( RUN_SUB_CNT_PTR ptr );

//----------------------------------------------------------------------------
/**
 *	@brief	初期化
 *
 *	@param	inHeapID	ヒープＩＤ
 *	@param	*inBgl		BGL
 *	@param	pkthlnPtr 	ポケスロンポインタ
 *
 *	@return	コントローラポインタ
 */
//-----------------------------------------------------------------------------
RUN_SUB_CNT_PTR RunSub_Init( const int inHeapID, GF_BGL_INI *inBgl, PKTHLN_PTR pkthlnPtr )
{
	int i;
	RUN_SUB_CNT_PTR ptr;
	int size;
	size = sizeof(RUN_SUB_CNT);

	ptr = sys_AllocMemory( inHeapID, size );
	MI_CpuClear8( ptr, size);

	ptr->HeapID = inHeapID;

	ptr->Bgl = inBgl;

	ptr->PkthlnPtr = pkthlnPtr;

	//BMP
	CreateBmpWin(ptr);

	//メッセージマネージャ
	//アーカイブから展開して表示
    ptr->MsgMan = MSGMAN_Create(MSGMAN_TYPE_DIRECT, ARC_MSG, NARC_msg_pokethlon_dat, inHeapID);
	//ワードセット
	ptr->Wset = WORDSET_Create( inHeapID );
	//ニックネームメモリ確保
	for(i=0;i<ENTRY_MAX;i++){
		ptr->NickName[i] = STRBUF_Create( MONS_NAME_SIZE+EOM_SIZE, inHeapID );
	}

	//ニックネーム取得
	{
		POKETHLON_ENTRY_DATA *entry;
		entry = PTFrame_GetEntryDataPtrByID(pkthlnPtr, PTFrameGetCurrentID(pkthlnPtr));
		for(i=0;i<ENTRY_MAX;i++){
			STRBUF_SetStringCode( ptr->NickName[i], entry[i].NickName );
		}
	}

	//ポケ名表示
	UpdateNextPoke(ptr, 1);

	//「しゅう」表示
	DispRoundTxt(ptr);

	//ポケグラで表示している参加ポケのインデックス初期値セット
	ptr->PokeIdx[0] = 1;
	ptr->PokeIdx[1] = 2;

	return ptr;
}

//----------------------------------------------------------------------------
/**
 *	@brief	解放
 *
 *	@param	ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_Free(RUN_SUB_CNT_PTR ptr)
{
	int i;
	for(i=0;i<ENTRY_MAX;i++){
		sys_FreeMemoryEz( ptr->PokeGra[i].PokeChar );
		sys_FreeMemoryEz( ptr->PokeGra[i].PokePal );
	}
	for(i=0;i<POKE_MAX;i++){
		sys_FreeMemoryEz( ptr->IconBuf[i] );
	}
	//スクリーンアーカイブ解放
	sys_FreeMemoryEz(ptr->RoundBgArc);

	//ニックネーム解放
	for(i=0;i<ENTRY_MAX;i++){
		STRBUF_Delete( ptr->NickName[i] );
	}
	//ワードセット
	WORDSET_Delete(ptr->Wset);
	//メッセージマネージャ
	MSGMAN_Delete(ptr->MsgMan);

	//BMP
	GF_BGL_BmpWinDel( &ptr->NameWin );
	GF_BGL_BmpWinDel( &ptr->RoundWin );

	sys_FreeMemoryEz(ptr);
}

//----------------------------------------------------------------------------
/**
 *	@brief		スクリーンセット
 *
 *	@param	ptr	コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetBG(RUN_SUB_CNT_PTR ptr)
{
	//キャラ
	ArcUtil_BgCharSet(ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_bg_ncgr,
						ptr->Bgl, GF_BGL_FRAME2_S, 0, 0, FALSE, ptr->HeapID);
	//スクリーン
	ArcUtil_ScrnSet(ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_bg_base_nscr,
						ptr->Bgl, GF_BGL_FRAME2_S, 0, 0, FALSE, ptr->HeapID);
	ArcUtil_ScrnSet(ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_bg_len_nscr,
						ptr->Bgl, GF_BGL_FRAME1_S, 0, 0, FALSE, ptr->HeapID);

	ptr->RoundBgArc = ArcUtil_ScrnDataGet(ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_bg_round_nscr,
						FALSE, &ptr->RoundScrnData, ptr->HeapID);
/**
	//周回スクリーンの初期化
	GF_BGL_ScreenBufSet( ptr->Bgl, GF_BGL_FRAME1_S,
			ptr->LenScrnData->rawData, ptr->LenScrnData->szByte );
	GF_BGL_LoadScreenV_Req(ptr->Bgl, GF_BGL_FRAME1_S);
*/
	//サブパレット
	ArcUtil_PalSet( ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_bg_nclr,
						PALTYPE_SUB_BG, 0, 64, ptr->HeapID );
}

//----------------------------------------------------------------------------
/**
 *	@brief		ＯＢＪセット
 *
 *	@param	ptr			コントローラポインタ
 *	@param	pActCntPtr	アクターコントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetObj(RUN_SUB_CNT_PTR ptr, PKTHLN_CLACT_CNT_PTR pActCntPtr)
{
	int i;
	int res_code[TRANS_POKE_NUM] = {RES_CODE_RUN_TRNS_POKE1, RES_CODE_RUN_TRNS_POKE2};
	for(i=0;i<TRANS_POKE_NUM;i++){
		PkthlnClAct_SetChar( pActCntPtr,
							ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCGR,
							res_code[i], NNS_G2D_VRAM_TYPE_2DSUB);
		PkthlnClAct_SetPaltt( pActCntPtr,
							ARC_FIELD_CUTIN_GRA, NARC_field_cutin_dp_boy01_NCLR,
							res_code[i], NNS_G2D_VRAM_TYPE_2DSUB, TRNS_PALETTE_NUM	);
		PkthlnClAct_SetCell( pActCntPtr,
							ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER, res_code[i]	);
		PkthlnClAct_SetAnm(	pActCntPtr,
							ARC_FIELD_CUTIN_GRA, NARC_field_cutin_poke_oam_NCER, res_code[i]	);
	}

	PkthlnClAct_SetChar( pActCntPtr,
					ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_obj_NCGR,
					RES_CODE_RUN_SUB, NNS_G2D_VRAM_TYPE_2DSUB);
	PkthlnClAct_SetPaltt( pActCntPtr,
					ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_obj_NCLR,
					RES_CODE_RUN_SUB, NNS_G2D_VRAM_TYPE_2DSUB, SUB_RUN_PALETTE_NUM	);
	PkthlnClAct_SetCell( pActCntPtr,
					ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_obj_NCER, RES_CODE_RUN_SUB	);
	PkthlnClAct_SetAnm(	pActCntPtr,
					ARC_PKTHEV_RUN, NARC_pkthev_run_run_sub_obj_NANR, RES_CODE_RUN_SUB	);
}

//----------------------------------------------------------------------------
/**
 *	@brief		セットアップ
 *
 *	@param	ptr			コントローラポインタ
 *	@param	pActCntPtr	アクターコントローラポインタ
 *	@param	cmm_res_ptr	共通リソースポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetPokeAct( RUN_SUB_CNT_PTR ptr, PKTHLN_CLACT_CNT_PTR pActCntPtr, CMN_RES_CNT_PTR cmm_res_ptr)
{
	int i;
	VecFx32 vec;

	//アイコン・マーカ・ボール・ステート
	for (i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_RUN_SUB, ACT_CODE_RUN_POKE_ICON);
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_RUN_SUB, ACT_CODE_RUN_MARKER);
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_BALL);
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_STATE);
	}

	//ポケグラ汗
	for(i=0;i<TRANS_POKE_NUM;i++){
		PkthlnClAct_SetActor(pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_SWEAT);
	}

	for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		ptr->PokeIcon[i].IconActPtr = PkthlnClAct_GetActPtr(pActCntPtr, RES_CODE_RUN_SUB, ACT_CODE_RUN_POKE_ICON);
		ptr->PokeIcon[i].MarkerActPtr = PkthlnClAct_GetActPtr(pActCntPtr, RES_CODE_RUN_SUB, ACT_CODE_RUN_MARKER);
		ptr->PokeIcon[i].ChgActPtr = PkthlnClAct_GetActPtr(pActCntPtr, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_BALL);
		ptr->PokeIcon[i].StateActPtr = PkthlnClAct_GetActPtr(pActCntPtr, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_STATE);
		PkthlnClAct_ChgAnm(ptr->PokeIcon[i].IconActPtr, i);
		PkthlnClAct_ChgAnm(ptr->PokeIcon[i].MarkerActPtr, 4+i);
///		PkthlnClAct_ChgAnm(ptr->PokeIcon[i].SweatActPtr, 8+0);
///		PkthlnClAct_ChgAnm(ptr->PokeIcon[i].PanicActPtr, 8+1);
		PkthlnClAct_ChgAnm(ptr->PokeIcon[i].ChgActPtr, 8+2);
	}

	//時計
	{
		VecFx32 vec;
		PKTHLN_ACT_PTR act_ptr = PkthlnClAct_SetGetActor(	pActCntPtr, BG_PRI, NNS_G2D_VRAM_TYPE_2DSUB,
															RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_WATCH );
		PkthlnClAct_SetActive(act_ptr, 1, 1);	//可視でセット
		PkthlnClAct_ChgAnm(act_ptr, 11);
		vec.z = 0;
		vec.x = FX32_ONE * WATCH_POS_X;
		vec.y = SUB_DISP_DISTANCE + (FX32_ONE * (WATCH_POS_Y));
		PkthlnClAct_SetPos(act_ptr, &vec);
	}

	//ポケグラ
	SetPokeGra(pActCntPtr, ptr);

	//共有リソースからアクター取得
	for(i=0;i<TIMER_ACT_NUM;i++){
		ptr->TimeNumActPtr[i] = CmnRes_CreateF2X2SubAct( cmm_res_ptr,
														  PkthlnClAct_GetClActSetAdr(pActCntPtr),
														  BG_PRI,
														  ptr->HeapID );
		CLACT_SetDrawFlag(ptr->TimeNumActPtr[i], 1);	//表示

		vec.x = TimerActPosX[i] * FX32_ONE;
		vec.y = SUB_DISP_DISTANCE + TIMER_ACT_POS_Y * FX32_ONE;
		vec.z = 0;
		//タイマーアクターの座標セット
		CLACT_SetMatrix(ptr->TimeNumActPtr[i], &vec);
		CLACT_AnmChg(ptr->TimeNumActPtr[i], DefaultTimerActAnm[i]);
	}

}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケモンアイコンセットアップ
 *
 *	@param	ptr			コントローラポインタ
 *	@param	inIconInfo	アイコン情報
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetupPokeIcon( RUN_SUB_CNT_PTR ptr, const ICON_INFO *inIconInfo )
{
	int i;
	ARCHANDLE* handle;
	handle = ArchiveDataHandleOpen( ARC_POKEICON, ptr->HeapID);

	// ポケモンアイコン用パレットを一気に読み込んでVRAM転送する
	ArcUtil_PalSet( ARC_POKEICON, PokeIconPalArcIndexGet(), PALTYPE_SUB_OBJ, POKEICON_PAL_OFFSET*0x20,
			  32*3, ptr->HeapID);		//アイコンパレット３本

	for(i=0;i<POKE_MAX;i++){
		int arc_index;
		int mons_no;
		u8 form;

		ptr->IconBuf[i] = sys_AllocMemoryLo(ptr->HeapID, 0x1000);
		mons_no = inIconInfo[i].MonsNo;
		form = inIconInfo[i].Form;
		// ポケモンのデータインデックス番号を取得
		arc_index = PokeIconCgxArcIndexGetByMonsNumber( mons_no, 0, form );
		// ポケモンキャラクタをバッファに転送
		ArchiveDataLoadByHandle(handle, arc_index, ptr->IconBuf[i]);
		NNS_G2dGetUnpackedBGCharacterData( ptr->IconBuf[i], &ptr->IconChara[i] );
		//パレット
		ptr->IconPalNo[i] = PokeIconPalNumGet( mons_no, form, 0 )+POKEICON_PAL_OFFSET;
	}

	ArchiveDataHandleClose( handle );

	//アイコン転送
	for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		RunSub_TransPokeIcon(ptr, i, 0);
/**
		int adrs;
		int poke_idx;
		CLACT_WORK_PTR act_ptr;

		act_ptr = PkthlnClAct_GetClActWorkPtr(ptr->PokeIcon[i].IconActPtr);
		poke_idx = i*ENTRY_MAX;
		adrs = POKEICON_VRAM_OFFSET + POKEICON_TRANS_SIZE*i;
		// キャラクター転送
		DC_FlushRange(ptr->IconChara[poke_idx]->pRawData, POKEICON_TRANS_SIZE);
		GXS_LoadOBJ(ptr->IconChara[poke_idx]->pRawData, adrs, POKEICON_TRANS_SIZE);
		// パレット設定
		CLACT_PaletteNoChg(act_ptr, ptr->IconPalNo[poke_idx]);
*/
		{
			VecFx32 vec;
			//表示
			PkthlnClAct_SetActive(ptr->PokeIcon[i].IconActPtr, 1, 1);
			PkthlnClAct_SetActive(ptr->PokeIcon[i].MarkerActPtr, 1, 1);
			vec.z = 0;
			vec.x = FX32_ONE * 160;
			vec.y = SUB_DISP_DISTANCE + (FX32_ONE * (192-16));
			PkthlnClAct_SetPos(ptr->PokeIcon[i].IconActPtr, &vec);
			PkthlnClAct_SetPos(ptr->PokeIcon[i].MarkerActPtr, &vec);
		}
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィックセット
 *
 *	@param	ptr				コントローラポインタ
 *	@param	inInfoList		モンスター情報リスト
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetupPokeGraphic(RUN_SUB_CNT_PTR ptr, const MONS_INFO *inInfoList)
{
	int i;
	SOFT_SPRITE_ARC sprite;
	//最後の引数は、FormNoと個性乱数です by soga 2006.05.01

	for(i=0;i<ENTRY_MAX;i++){
		const MONS_INFO *info;
		info = &inInfoList[i];
		PokeGraArcDataGet( &sprite, info->MonsNo, info->Sex, PARA_FRONT, info->Rare, info->Form, info->PsnlRnd );
		ptr->PokeGra[i].PokeChar =
			Ex_ChangesInto_BattlePokeData_Alloc(sprite.arc_no, sprite.index_chr, ptr->HeapID,
				info->PsnlRnd, FALSE, PARA_FRONT, info->MonsNo);
		ptr->PokeGra[i].PokePal =
			ChangesInto_BattlePokePalData_Alloc( sprite.arc_no, sprite.index_pal, ptr->HeapID);
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラフィック転送
 *
 *	@param	ptr		コントローラ
 *	@param	inTarget		転送ターゲット
 *	@param	inTargetPoke	ポケインデックス
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_TransPokeGra( RUN_SUB_CNT_PTR ptr, const u8 inTarget, const u8 inTargetPoke)
{
	int chr_trans_size;
	int plt_trans_size;

	GF_ASSERT(inTarget < TRANS_POKE_NUM);
	GF_ASSERT(inTargetPoke < ENTRY_MAX);

	chr_trans_size = (32*10)*10;	//32byte x10 y10
	plt_trans_size = 32;	//32byte

	DC_FlushRange(ptr->PokeGra[inTargetPoke].PokeChar,chr_trans_size);
	GXS_LoadOBJ( ptr->PokeGra[inTargetPoke].PokeChar, ptr->ImageVram[inTarget], chr_trans_size );

	DC_FlushRange( ptr->PokeGra[inTargetPoke].PokePal, plt_trans_size );
	GXS_LoadOBJPltt( ptr->PokeGra[inTargetPoke].PokePal, ptr->PaletteVram[inTarget], plt_trans_size );	//32byte 1Palette

}

//----------------------------------------------------------------------------
/**
 *	@brief		アイコン転送
 *
 *	@param	ptr				コントローラ
 *	@param	inNetID			ネットID
 *	@param	inEntryIdx		エントリーインデックス
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_TransPokeIcon(RUN_SUB_CNT_PTR ptr, const u8 inNetID, const u8 inEntryIdx)
{
	int adrs;
	int poke_idx;
	CLACT_WORK_PTR act_ptr;

	act_ptr = PkthlnClAct_GetClActWorkPtr(ptr->PokeIcon[inNetID].IconActPtr);
	adrs = POKEICON_VRAM_OFFSET + POKEICON_TRANS_SIZE*inNetID;

	poke_idx = (inNetID * ENTRY_MAX) + inEntryIdx;

	// キャラクター転送
	DC_FlushRange(ptr->IconChara[poke_idx]->pRawData, POKEICON_TRANS_SIZE);
	GXS_LoadOBJ(ptr->IconChara[poke_idx]->pRawData, adrs, POKEICON_TRANS_SIZE);
	// パレット設定
	CLACT_PaletteNoChg(act_ptr, ptr->IconPalNo[poke_idx]);
}

//----------------------------------------------------------------------------
/**
 *	@brief		走行距離からアイコンの表示位置を算出する
 *
 *	@param	ptr				コントローラ
 *	@param	inNetID			ネットID
 *	@param	inLen			走行距離
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetIconPos(RUN_SUB_CNT_PTR ptr, const u8 inNetID, const int inLen)
{
	int len;
	VecFx32 pos;
	u16 rad;

	len = inLen % LEN_MAX;
	rad = (0x10000 * len) / LEN_MAX;
	rad = 0x10000 - rad;

	{
		//位置ベクトルを回転させる
		VecFx32 vec = {0,FX32_ONE*CIRCLE_R,0};
		VecFx32 center = {FX32_ONE*CIRCLE_CENTER_X,SUB_DISP_DISTANCE+FX32_ONE*CIRCLE_CENTER_Y,0};
		MtxFx33 rot;
		MTX_RotZ33(&rot, FX_SinIdx(rad), FX_CosIdx(rad));
		MTX_MultVec33(&vec, &rot, &vec);
		//円中心から移動
		VEC_Add( &center, &vec, &pos );
	}

	PkthlnClAct_SetPos(ptr->PokeIcon[inNetID].IconActPtr, &pos);
	PkthlnClAct_SetPos(ptr->PokeIcon[inNetID].MarkerActPtr, &pos);
	PkthlnClAct_SetPos(ptr->PokeIcon[inNetID].StateActPtr, &pos);
	PkthlnClAct_SetPos(ptr->PokeIcon[inNetID].ChgActPtr, &pos);
}


//----------------------------------------------------------------------------
/**
 *	@brief	走行距離（週回数）のフィル
 *
 *	@param	cnt_ptr				コントローラ
 *	@param	inRound			周回数
 *	@param	inLen			走行距離（1周分未満）
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_FillRound(RUN_SUB_CNT_PTR cnt_ptr, const u8 inRound, const u16 inLen)
{
	u8 i;
	u8 t,o,f;
	u8 read_x[ROUND_DIGI_MAX];
	u8 read_y[ROUND_DIGI_MAX];

	//2桁の周回数を2つに分解
	t = inRound/10;
	o = inRound%10;

	//少数第一位
	f = ((float)inLen) / 102.4;

	//データ読み込み位置を算出(数字スクリーンデータに依存)
	read_x[0] = (t%NUMBER_SCR_NUM_W)*ROUND_NUMBER_W;
	read_y[0] = (t/NUMBER_SCR_NUM_W)*ROUND_NUMBER_H;
	read_x[1] = (o%NUMBER_SCR_NUM_W)*ROUND_NUMBER_W;
	read_y[1] = (o/NUMBER_SCR_NUM_W)*ROUND_NUMBER_H;

	for (i=0;i<ROUND_DIGI_MAX;i++){
		GF_BGL_ScrWriteFree(cnt_ptr->Bgl, GF_BGL_FRAME1_S,
				ROUND_DISP_START_X+(i*ROUND_NUMBER_W), ROUND_DISP_START_Y,
				ROUND_NUMBER_W, ROUND_NUMBER_H,
				&cnt_ptr->RoundScrnData->rawData,
				read_x[i], read_y[i], ROUND_NUMBER_W*NUMBER_SCR_NUM_W, ROUND_NUMBER_H*NUMBER_SCR_NUM_H );
	}

	//小数点以下をフィル
	read_x[0] = (f%NUMBER_SCR_NUM_W)*ROUND_NUMBER_W;
	read_y[0] = (f/NUMBER_SCR_NUM_W)*ROUND_NUMBER_H;
	GF_BGL_ScrWriteFree(cnt_ptr->Bgl, GF_BGL_FRAME1_S,
				RFLOAT_DISP_START_X, ROUND_DISP_START_Y,
				ROUND_NUMBER_W, ROUND_NUMBER_H,
				&cnt_ptr->RoundScrnData->rawData,
				read_x[0], read_y[0], ROUND_NUMBER_W*NUMBER_SCR_NUM_W, ROUND_NUMBER_H*NUMBER_SCR_NUM_H );

	GF_BGL_LoadScreenV_Req(cnt_ptr->Bgl, GF_BGL_FRAME1_S);
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケグラスライド交代
 *
 *	@param	ptr				コントローラ
 *	@param	inRunPokeIdx	走行ポケモンインデックス
 *
 *	@return	BOOL			TRUEで終了
 */
//-----------------------------------------------------------------------------
BOOL RunSub_PokeChangeMain(RUN_SUB_CNT_PTR ptr, const u8 inRunPokeIdx)
{
	int *seq = &ptr->PokeGraChgSeq;
	switch(*seq){
	case 0:
		{
			VecFx32 vec;
			//次に出すポケのグラフィックをスライド
			vec = *PkthlnClAct_GetPos(ptr->ActPtr[ ptr->SlideTarget ]);
			vec.y += SLIDE_SPEED;
			PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
			PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//汗
			if (vec.y >= SUB_DISP_DISTANCE + POKEGRA_OUT_POS*FX32_ONE){		//スライド終了？
				//座標を画面上部に移動
				vec.y = SUB_DISP_DISTANCE + ( -(POKEGRA_W/2) * FX32_ONE);
				PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
				PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//汗
				//シーケンス変更
				(*seq)++;
			}
		}
		break;
	case 1:
		//トランス
		RunSub_TransPokeGra( ptr, ptr->SlideTarget, inRunPokeIdx);
		//インデックス更新
		if (ptr->PokeIdx[ ptr->SlideTarget ] == 0){
			ptr->PokeIdx[ ptr->SlideTarget ] = ENTRY_MAX-1;
		}else{
			ptr->PokeIdx[ ptr->SlideTarget ]--;
		}
		//スライド対象更新
		ptr->SlideTarget = (ptr->SlideTarget+1)%TRANS_POKE_NUM;
		//シーケンス変更
		(*seq)++;
		break;
	case 2:
		//さらに次のポケのグラフィックをスライド
		{
			VecFx32 vec;
			//次に出すポケのグラフィックをスライド
			vec = *PkthlnClAct_GetPos(ptr->ActPtr[ ptr->SlideTarget ]);
			vec.y += SLIDE_SPEED;
			PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
			PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ汗
			if (vec.y >= SUB_DISP_DISTANCE + POKEGRA_POS2*FX32_ONE){		//スライド終了？
				vec.y = SUB_DISP_DISTANCE + POKEGRA_POS2*FX32_ONE;
				PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
				PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ汗
				//スライド対象更新
				ptr->SlideTarget = (ptr->SlideTarget+1)%TRANS_POKE_NUM;
				//シーケンス変更
				(*seq)++;
			}
		}
		break;
	case 3:
		//画面上部にあるポケのグラフィックをスライドイン
		{
			VecFx32 vec;
			//次に出すポケのグラフィックをスライド
			vec = *PkthlnClAct_GetPos(ptr->ActPtr[ ptr->SlideTarget ]);
			vec.y += SLIDE_SPEED;
			PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
			PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ汗
			if (vec.y >= SUB_DISP_DISTANCE + POKEGRA_POS1*FX32_ONE){		//スライド終了？
				vec.y = SUB_DISP_DISTANCE + POKEGRA_POS1*FX32_ONE;
				PkthlnClAct_SetPos(ptr->ActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ
				PkthlnClAct_SetPos(ptr->SweatActPtr[ ptr->SlideTarget ], &vec);	//ポケグラ汗
				//スライド対象更新
				ptr->SlideTarget = (ptr->SlideTarget+1)%TRANS_POKE_NUM;

				//ポケ名変更
				{
					u8 idx;
					idx = (inRunPokeIdx+2)%ENTRY_MAX;
					UpdateNextPoke(ptr, idx);
				}
				//シーケンス初期化
				(*seq) = 0;
				//交代終了
				return TRUE;
			}
		}
		break;
	}
	return FALSE;
}

//----------------------------------------------------------------------------
/**
 *	@brief		NPCポケグラスライド交代(ダミー)
 *
 *	@param	ptr			コントローラポインタ
 *	@param	inNpcIdx	NPCインデックス
 *
 *	@return	BOOL		TRUEで終了
 */
//-----------------------------------------------------------------------------
BOOL RunSub_NpcPokeChangeMain(RUN_SUB_CNT_PTR ptr, const u8 inNpcIdx)
{
	GF_ASSERT((0<inNpcIdx)&&(inNpcIdx<ENTRY_MEMBER_NUM_MAX));
	ptr->NpcData[inNpcIdx-1].Move += (SLIDE_SPEED/FX32_ONE);
	if (ptr->NpcData[inNpcIdx-1].Move >= MOVE_DIST){
		ptr->NpcData[inNpcIdx-1].Move = 0;
		ptr->NpcData[inNpcIdx-1].Count++;
	}

	if ( ptr->NpcData[inNpcIdx-1].Count>=3){
		ptr->NpcData[inNpcIdx-1].Count = 0;
		return TRUE;
	}

	return FALSE;
}

//----------------------------------------------------------------------------
/**
 *	@brief		セットアップ
 *
 *	@param	ptr			コントローラポインタ
 *	@param	inNetID		ネットID
 *	@param	inPokeIdx	ポケモンインデックス
 *	@param	inChg		交代中か？
 *	@param	inState		ステート
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void  RunSub_SetDrawSubDispIcon(RUN_SUB_CNT_PTR ptr,
		const u8 inNetID, const u8 inPokeIdx, const BOOL inChg, const int inState)
{
	//ローカルで保存してるポケエントリインデックスと差異があるなら、ポケアイコントランス
	if (ptr->LocalPokeIdx[inNetID] != inPokeIdx){
		ptr->LocalPokeIdx[inNetID] = inPokeIdx;
		RunSub_TransPokeIcon(ptr, inNetID, inPokeIdx);
	}

	if(inChg){		//交代中
		//アイコン消して、ボール出す
		PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].IconActPtr, 1, 0);
		PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].ChgActPtr, 1, 1);
		PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].StateActPtr, 1, 0);
	}else{
		//アイコン出してボール消す
		PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].IconActPtr, 1, 1);
		PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].ChgActPtr, 1, 0);
		//疲れエフェクトの表示・非表示判定
		switch(inState){
		case POKE_ST_FATIGUE:
			if (ptr->PokeIcon[inNetID].StateLocal != inState){
				PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].StateActPtr, 1, 1);
				PkthlnClAct_ChgAnm(ptr->PokeIcon[inNetID].StateActPtr, 8+0);
			}
			break;
		case POKE_ST_PANIC:
			if ( ptr->PokeIcon[inNetID].StateLocal != inState ){
				PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].StateActPtr, 1, 1);
				PkthlnClAct_ChgAnm(ptr->PokeIcon[inNetID].StateActPtr, 8+1);
			}
			break;
		default:
			PkthlnClAct_SetActive(ptr->PokeIcon[inNetID].StateActPtr, 1, 0);
		}
	}
	ptr->PokeIcon[inNetID].StateLocal = inState;
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケグラの汗表示
 *
 *	@param	ptr	コントローラポインタ
 *	@param	inState1	インデックス0のポケのステート
 *	@param	inState2	インデックス1のポケのステート
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void  RunSub_SetDrawSweat(RUN_SUB_CNT_PTR ptr,const u8 inState1, const u8 inState2)
{
	//汗の表示有無
	if (inState1 == POKE_ST_FATIGUE){
		PkthlnClAct_SetActive(ptr->SweatActPtr[0], 1, 1);
	}else{
		PkthlnClAct_SetActive(ptr->SweatActPtr[0], 1, 0);
	}
	if (inState2 == POKE_ST_FATIGUE){
		PkthlnClAct_SetActive(ptr->SweatActPtr[1], 1, 1);
	}else{
		PkthlnClAct_SetActive(ptr->SweatActPtr[1], 1, 0);
	}
}

//----------------------------------------------------------------------------
/**
 *	@brief	タイマー表示
 *
 *	@param	ptr	コントローラポインタ
 *	@param	inTime	タイム
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_DispTime(RUN_SUB_CNT_PTR ptr, const u16 inTime)
{
	u8 min;
	u8 miri,miri_t;
	u8 sec,sec_t,sec_o;

	//秒計算
	sec = inTime / 30;
	//秒以下
	miri = inTime % 30;
	miri = (miri*100)/30;
	//分計算
	min = sec / 60;
	sec = sec % 60;

	sec_t = sec / 10;
	sec_o = sec % 10;
	miri_t = miri / 10;

	//分を書き換え
	CLACT_AnmChg(ptr->TimeNumActPtr[0], min+1);
	//秒を書き換え
	CLACT_AnmChg(ptr->TimeNumActPtr[2], sec_t+1);
	CLACT_AnmChg(ptr->TimeNumActPtr[3], sec_o+1);
	//小数以下を書き換え
	CLACT_AnmChg(ptr->TimeNumActPtr[5], miri_t+1);
}

//----------------------------------------------------------------------------
/**
 *	@brief		プライオリティセット
 *
 *	@param	ptr		コントローラポインタ
 *	@param	inMyNetID	ネットＩＤ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
void RunSub_SetPriority( RUN_SUB_CNT_PTR ptr, const int inMyNetID)
{
	int i;
	u8 order[ENTRY_MEMBER_NUM_MAX];

	//フォント系プライオリティのセット
	for(i=0;i<TIMER_ACT_NUM;i++){
		CLACT_DrawPriorityChg( ptr->TimeNumActPtr[i], PRI_TRNS_POKE );
	}
	//ポケグラのプライオリティセット
	for(i=0;i<TRANS_POKE_NUM;i++){
		CLACT_WORK_PTR act_ptr;
		act_ptr = PkthlnClAct_GetClActWorkPtr(ptr->ActPtr[i]);
		CLACT_DrawPriorityChg( act_ptr, PRI_TRNS_POKE );
	}

	//順番決定
	{
		u8 count = 1;
		for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
			if (i == inMyNetID){
				order[0] = i;
			}
		}
		for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
			if (order[0] == i){
				continue;
			}
			order[count++] = i;
		}
	}
	for(i=0;i<ENTRY_MEMBER_NUM_MAX;i++){
		//ポケモンステート・ボール・アイコンのプライオリティをセット
		PkthlnClAct_SetPriority(ptr->PokeIcon[order[i]].StateActPtr, PRI_STATE_BASE+(i*2));
		PkthlnClAct_SetPriority(ptr->PokeIcon[order[i]].ChgActPtr, PRI_STATE_BASE+(i*2));
		PkthlnClAct_SetPriority(ptr->PokeIcon[order[i]].IconActPtr, (PRI_STATE_BASE+1)+(i*2));
		//マーカーのプライオリティセット
		PkthlnClAct_SetPriority(ptr->PokeIcon[order[i]].MarkerActPtr, PRI_MAKER_BASE+i);
	}

	//ポケグラの上の汗表示プライオリティをセット
	;
}

//----------------------------------------------------------------------------
/**
 *	@brief		ポケグラのエントリーインデックスを取得
 *
 *	@param	ptr		コントローラポインタ
 *	@param	inIdx	取得する方のインデックス0 or 1
 *
 *	@return	u8		インデックス
 */
//-----------------------------------------------------------------------------
u8 RunSub_GetEntryIdx( RUN_SUB_CNT_PTR ptr, const int inIdx)
{
	return ptr->PokeIdx[inIdx];
}

//----------------------------------------------------------------------------
/**
 *	@brief		つぎの走行ポケ表示の更新
 *
 *	@param	ptr		コントローラポインタ
 *	@param	inPokeIdx
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void UpdateNextPoke(RUN_SUB_CNT_PTR ptr, const u8 inPokeIdx)
{
	STRBUF *str;
	GF_BGL_BmpWinDataFill( &ptr->NameWin, 0);

	WORDSET_RegisterWord( ptr->Wset, 0, ptr->NickName[inPokeIdx], PM_NEUTRAL, TRUE, PM_LANG );
	str = MSGDAT_UTIL_AllocExpandString(ptr->Wset, ptr->MsgMan, msg_pkthln_run_next, ptr->HeapID);
	GF_STR_PrintColor( 	&ptr->NameWin, FONT_SYSTEM, str,
					0, 0, MSG_NO_PUT, COL_N_WHITE, NULL );
	STRBUF_Delete(str);//<一括表示なので、メモリをここで消してもOK

	GF_BGL_BmpWinOn(&ptr->NameWin);
}

//----------------------------------------------------------------------------
/**
 *	@brief	「しゅう」表示
 *
 *	@param	ptr		コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void DispRoundTxt(RUN_SUB_CNT_PTR ptr)
{
	STRBUF *str;
	GF_BGL_BmpWinDataFill( &ptr->RoundWin, 0);

	str = MSGMAN_AllocString(ptr->MsgMan, msg_pkthln_relay_score);
	GF_STR_PrintColor( 	&ptr->RoundWin, FONT_SYSTEM, str,
					0, 0, MSG_NO_PUT, COL_N_WHITE, NULL );
	STRBUF_Delete(str);//<一括表示なので、メモリをここで消してもOK

	GF_BGL_BmpWinOn(&ptr->RoundWin);
}

//----------------------------------------------------------------------------
/**
 *	@brief	ポケモンセット
 *
 *	@param	inActCntPtr	アクターコントローラポインタ
 *	@param	ptr			コントローラポインタ
 *
 *	@return	none
 */
//-----------------------------------------------------------------------------
static void SetPokeGra(PKTHLN_CLACT_CNT_PTR inActCntPtr, RUN_SUB_CNT_PTR ptr)
{
	int i;
	int res_code[TRANS_POKE_NUM] = {RES_CODE_RUN_TRNS_POKE1, RES_CODE_RUN_TRNS_POKE2};
	int act_code[TRANS_POKE_NUM] = {ACT_CODE_RUN_TRNS_POKE1, ACT_CODE_RUN_TRNS_POKE2};
	for(i=0;i<TRANS_POKE_NUM;i++){
		PkthlnClAct_SetActor(	inActCntPtr, BG_PRI,
								NNS_G2D_VRAM_TYPE_2DSUB,
								res_code[i], act_code[i]	);
	}
	for(i=0;i<TRANS_POKE_NUM;i++){
		VecFx32 vec;
		CLACT_WORK_PTR act_ptr;
		ptr->ActPtr[i] =
			PkthlnClAct_GetActPtr(inActCntPtr, res_code[i], act_code[i]);
		act_ptr = PkthlnClAct_GetClActWorkPtr(ptr->ActPtr[i]);
		{
			u8 w,m;
			w = POKEGRA_W;
			m = POKEGRA_MARGINE;
			vec.z = 0;
			vec.x = (POKEGRA_W/2) * FX32_ONE;
			vec.y = SUB_DISP_DISTANCE+((((w/2)+m)+(w+m)*(TRANS_POKE_NUM-1-i))*FX32_ONE);
			CLACT_SetMatrix( act_ptr, &vec );
		}
		PkthlnClAct_SetActive(ptr->ActPtr[i], 1, 1);	//可視でセット

		//ポケグラ汗
		ptr->SweatActPtr[i] = PkthlnClAct_GetActPtr(inActCntPtr, RES_CODE_RUN_SUB, ACT_CODE_RUN_SUB_SWEAT);
		PkthlnClAct_ChgAnm(ptr->SweatActPtr[i], 8+0);
		PkthlnClAct_SetPos(ptr->SweatActPtr[i], &vec);
		PkthlnClAct_SetActive(ptr->SweatActPtr[i], 1, 0);	//不可視でセット
	}

	AttouchPokeVramAdr( inActCntPtr, ptr );
}


//----------------------------------------------------------------------------
/**
 *	@brief	ＶＲＡＭアドレス割り当て
 *
 *	@param	inActPtr		アクターコントローラポインタ
 *	@param	ptr 				コントローラポインタ
 *
 *	@return
 */
//-----------------------------------------------------------------------------
static void AttouchPokeVramAdr( PKTHLN_CLACT_CNT_PTR inActPtr, RUN_SUB_CNT_PTR ptr )
{
	CLACT_U_RES_OBJ_PTR res_obj_ptr;
	CLACT_U_RES_OBJ_PTR res_pal_ptr;
	NNSG2dImageProxy *image_proxy;
	const NNSG2dImagePaletteProxy *palette_proxy;

	u8 i;
	int res_code[TRANS_POKE_NUM] = {RES_CODE_RUN_TRNS_POKE1, RES_CODE_RUN_TRNS_POKE2};

	for(i=0;i<TRANS_POKE_NUM;i++){
		res_obj_ptr = *PkthlnClAct_GetResObjPtrAdr( inActPtr, res_code[i] , CLACT_U_CHAR_RES );
		res_pal_ptr = *PkthlnClAct_GetResObjPtrAdr( inActPtr, res_code[i] , CLACT_U_PLTT_RES );
		image_proxy = CLACT_U_CharManagerGetProxy( res_obj_ptr );
		palette_proxy = CLACT_U_PlttManagerGetProxy( res_pal_ptr, image_proxy );

		ptr->ImageVram[i] = NNS_G2dGetImageLocation( image_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
		ptr->PaletteVram[i] = NNS_G2dGetImagePaletteLocation( palette_proxy, NNS_G2D_VRAM_TYPE_2DSUB );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BMPウィンドウ追加
 *
 * @param 	ptr			コントローラポインタ
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void CreateBmpWin( RUN_SUB_CNT_PTR ptr )
{
	GF_BGL_BmpWinAddEx( ptr->Bgl, &ptr->NameWin, &RunEvtBmpData[0] );
	GF_BGL_BmpWinAddEx( ptr->Bgl, &ptr->RoundWin, &RunEvtBmpData[1] );

	//先頭キャラをクリア（スクリーンクリアされてるところは、このキャラで埋まる）
	GF_BGL_CharFill( ptr->Bgl, MSG_BG, 0, 1, 0 );

	//システム用フォントパレット転送
	SystemFontPaletteLoad(PALTYPE_SUB_BG, RUN_SYS_FONT_PAL*32, ptr->HeapID);
}
